package com.kafka.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import net.sf.json.JSONObject;


public abstract class HttpUtil{

	/**
	 * 
	 */
//	private static final long serialVersionUID = 6406429834606739126L;
	public static final String DEFAULT_CHARSET = "utf-8";
	private static final String METHOD_POST = "POST";
//	private static final String METHOD_GET = "GET";
	private static int CONNECTTIMEOUT= 60000;
	private static int READTIMEOUT=60000;
	
	private HttpUtil() {}

	
	/**
	 * 执行HTTP POST请求。
	 * 
	 * @param url 请求地址
	 * @param params 请求参数
	 * @return 响应字符串
	 * @throws IOException
	 */
	public static String doPost(String url, String params,String appID,String secretKey) throws IOException {
		return doPost(url, params, appID, secretKey, DEFAULT_CHARSET);
	}

	/**
	 * 执行HTTP POST请求。
	 * @param url 请求地址
	 * @param ctype 请求类型
	 * @param content 请求字节数组
	 * @return 响应字符串
	 * @throws IOException
	 */
	public static String doPost(String url, String params,String appID,String secretKey, String charset) throws IOException {
		HttpURLConnection conn = null;
		OutputStream out = null;
		String rsp = null;
		
		try {
			String ctype = "application/json;charset=" + charset;
//			String query = buildQuery(params, charset);
			String query = params;
			byte[] content={};
			if(query!=null){
				content=query.getBytes(charset);
			}
			try{
				conn = getConnection(new URL(url), METHOD_POST, ctype, appID, params, secretKey);	
				conn.setConnectTimeout(CONNECTTIMEOUT);
				conn.setReadTimeout(READTIMEOUT);
				
				
			}catch(IOException e){
				throw e;
			}
			try{
				out = conn.getOutputStream();
				out.write(content);
				rsp = getResponseAsString(conn);
			}catch(IOException e){
				throw e;
			}
			
		}finally {
			if (out != null) {
				out.close();
			}
			if (conn != null) {
				conn.disconnect();
			}
		}

		return rsp;
	}

	private static HttpURLConnection getConnection(URL url, String method, String ctype,String appID,String params,String secretKey)
			throws IOException {
		InetAddress ipaddr = InetAddress.getLocalHost();
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod(method);
		conn.setDoInput(true);
		conn.setDoOutput(true);
		//conn.setRequestProperty("Accept", "text/xml,text/javascript,text/html");
		conn.setRequestProperty("User-Agent", "uus-sdk-java");
		conn.setRequestProperty("Content-Type", ctype);
		conn.setRequestProperty("API-RemoteIP", ipaddr.getHostAddress());
		conn.setRequestProperty("AppID", appID);
		Date date = new Date();       
		Timestamp timestamp = new Timestamp(date.getTime());
		conn.setRequestProperty("TS", timestamp.toString());
		String values = timestamp + params + secretKey;
		conn.setRequestProperty("Token", toMD5(values));
		return conn;
	}

    public static String toMD5(String values){
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] bytes = digest.digest(values.getBytes());
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < bytes.length; i++) {
                String s = Integer.toHexString(0xff&bytes[i]);
                if(s.length()==1){
                    sb.append("0"+s);
                }else{
                    sb.append(s);
                }
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
            //异常的情况是不可能发生的
            throw new RuntimeException("");
        }
 
    }

	public static String buildQuery(Map<String, String> params, String charset) throws IOException {
		if (params == null || params.isEmpty()) {
			return null;
		}

		StringBuilder query = new StringBuilder();
		Set<Entry<String, String>> entries = params.entrySet();
		boolean hasParam = false;

		for (Entry<String, String> entry : entries) {
			String name = entry.getKey();
			String value = entry.getValue();
			// 忽略参数名或参数值为空的参数
			if (StringUtil.areNotEmpty(name, value)) {
				if (hasParam) {
					query.append("&");
				} else {
					hasParam = true;
				}

				query.append(name).append("=").append(URLEncoder.encode(value, charset));
			}
		}

		return query.toString();
	}

	protected static String getResponseAsString(HttpURLConnection conn) throws IOException {
		String charset = getResponseCharset(conn.getContentType());
		InputStream es = conn.getErrorStream();
		if (es == null) {
			return getStreamAsString(conn.getInputStream(), charset);
		} else {
			String msg = getStreamAsString(es, charset);
			if (StringUtil.isEmpty(msg)) {
				throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
			} else {
				throw new IOException(msg);
			}
		}
	}

	private static String getStreamAsString(InputStream stream, String charset) throws IOException {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset));
			StringWriter writer = new StringWriter();

			char[] chars = new char[256];
			int count = 0;
			while ((count = reader.read(chars)) > 0) {
				writer.write(chars, 0, count);
			}

			return writer.toString();
		} finally {
			if (stream != null) {
				stream.close();
			}
		}
	}

	private static String getResponseCharset(String ctype) {
		String charset = DEFAULT_CHARSET;

		if (!StringUtil.isEmpty(ctype)) {
			String[] params = ctype.split(";");
			for (String param : params) {
				param = param.trim();
				if (param.startsWith("charset")) {
					String[] pair = param.split("=", 2);
					if (pair.length == 2) {
						if (!StringUtil.isEmpty(pair[1])) {
							charset = pair[1].trim();
						}
					}
					break;
				}
			}
		}

		return charset;
	}

	/**
	 * 使用默认的UTF-8字符集反编码请求参数值。
	 * 
	 * @param value 参数值
	 * @return 反编码后的参数值
	 */
	public static String decode(String value) {
		return decode(value, DEFAULT_CHARSET);
	}

	/**
	 * 使用默认的UTF-8字符集编码请求参数值。
	 * 
	 * @param value 参数值
	 * @return 编码后的参数值
	 */
	public static String encode(String value) {
		return encode(value, DEFAULT_CHARSET);
	}

	/**
	 * 使用指定的字符集反编码请求参数值。
	 * 
	 * @param value 参数值
	 * @param charset 字符集
	 * @return 反编码后的参数值
	 */
	public static String decode(String value, String charset) {
		String result = null;
		if (!StringUtil.isEmpty(value)) {
			try {
				result = URLDecoder.decode(value, charset);
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
		return result;
	}

	/**
	 * 使用指定的字符集编码请求参数值。
	 * 
	 * @param value 参数值
	 * @param charset 字符集
	 * @return 编码后的参数值
	 */
	public static String encode(String value, String charset) {
		String result = null;
		if (!StringUtil.isEmpty(value)) {
			try {
				result = URLEncoder.encode(value, charset);
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
		return result;
	}

	/**
	 * 从URL中提取所有的参数。
	 * 
	 * @param query URL地址
	 * @return 参数映射
	 */
	public static Map<String, String> splitUrlQuery(String query) {
		Map<String, String> result = new HashMap<String, String>();

		String[] pairs = query.split("&");
		if (pairs != null && pairs.length > 0) {
			for (String pair : pairs) {
				String[] param = pair.split("=", 2);
				if (param != null && param.length == 2) {
					result.put(param[0], param[1]);
				}
			}
		}

		return result;
	}

	public static void main(String[] args) throws IOException {
		try {
			JSONObject jsonData = new JSONObject();
			jsonData.put("Uuid", "363636363636");
			jsonData.put("LoginName", "呵呵哒2");
			jsonData.put("Phone", "07713333333");
			jsonData.put("Healthcare_card", "12345679");
			jsonData.put("Avatar", "双子");
			jsonData.put("Weixin", "honganlei");
			jsonData.put("True_name", "雷洪岸");
			jsonData.put("Passwd", "215361911");
			jsonData.put("Birthday", "1985-06-04");
			jsonData.put("Agedness_card", "5666666255");
			jsonData.put("QQ", "283729055");
			jsonData.put("Area_info", "青秀区");
			jsonData.put("Mobile", "18978914297");
			jsonData.put("Community", "团员");
			jsonData.put("Contact", "无");
			jsonData.put("Spouse_name", "张某某");
			jsonData.put("Email", "283729845@qq.com");
			jsonData.put("Spouse_status", "活着");
			jsonData.put("Username", "shuangzi");
			jsonData.put("Address", "广西南宁某小区");
			
			jsonData.put("Constellation", 1);
			jsonData.put("User_class", 2);
			jsonData.put("Politics", 1);
			jsonData.put("Area", 2);
			jsonData.put("Zodiac", 1);
			jsonData.put("Nation", 3);
			jsonData.put("Integral", 2);
			jsonData.put("Service_class", 1);
			jsonData.put("Marriage", 0);
			jsonData.put("Province", 1);
			jsonData.put("Nationality", 3);
			jsonData.put("City", 2);
			jsonData.put("Source", 1);
			jsonData.put("District", 8);
			jsonData.put("Gender", 0);
			
			
			String rs = HttpUtil.doPost("http://120.24.70.51:7928/api/user/doc/add", jsonData.toString(),"demo","skdemosk");
			System.out.println(rs);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
